/*
 * HtmlFilesImporter.java
 *
 *  created: 29.9.2011
 *  charset: UTF-8
 *  license: MIT (X11) (See LICENSE file for full license)
 */
package cz.mp.k3bg.core;

import cz.mp.k3bg.Constants;
import cz.mp.k3bg.log.LoggerManager;
import cz.mp.util.FileUtils;
import cz.mp.util.StringUtils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Logger;

/**
 * Kopíruje (a případně modifikuje soubory) do pracovního adresáře;
 * zachovává relativní cesty html souborů, 
 * pokud je jich na jednou přidáváno více.
 *
 * @author Martin Pokorný
 * @version 0.1
 */
public class HtmlFilesImporter extends FileImporter {

    private static final boolean DEBUG = false;
    private static final Logger logger =
            LoggerManager.getLogger(HtmlFilesImporter.class, DEBUG);
    
    // (musí být, a být HtmlFile, protože je třeba získat obrázky a styly)
    private ArrayList<HtmlFile> allHtmlFiles = new ArrayList<HtmlFile>();

    private Set<ItemImage> images = new TreeSet<ItemImage>();

    private Set<StyleFile> styleFiles = new TreeSet<StyleFile>();

    private ArrayList<String> srcFiles = new ArrayList<String>();
    
            
    /** */
    public HtmlFilesImporter(String destDir) {
        super(destDir);

    }


    // -----
    
    /**
     * 
     * @param srcFiles 
     */
    public void addFiles(ArrayList<String> srcFiles) {
        this.srcFiles.addAll(srcFiles);
    }
    
    /**
     * 
     * @param srcFiles 
     */
    public void addFiles(String... srcFiles) {
        this.srcFiles.addAll(Arrays.asList(srcFiles));
    }    
    
    /**
     * 
     */
    public void clearFiles() {
        this.srcFiles = new ArrayList<String>(); 
    }

    /**
     * Provede kopírování souborů do zadaného adresáře, 
     * s modifikací kopií {@code html} souborů.
     * 
     * @throws IOException 
     */
    @Override
    public void importt() throws IOException {
        importt(true);
    }
        
    /**
     * Provede kopírování souborů do zadaného adresáře.
     * 
     * @param modifyHtmlFiles  modifikovat kopie {@code html} souborů
     * @throws IOException 
     */
    public void importt(boolean modifyHtmlFiles) throws IOException {
        logger.info("");
        addToHtmlFilesList(srcFiles);
        initHtmlFiles();
        
        String commonDirPathOfFiles = FileUtils.getCommonDir(getAllFiles());        
        logger.fine("commonDirPathOfFiles = '" + commonDirPathOfFiles + "'");
        
        // kopírování souborů
        for (ItemImage imgFile : this.images) {
            String copyFilePath = createCopyFilePathInNewDir(
                    imgFile, commonDirPathOfFiles);
            FileUtils.copyFile(imgFile.getPath(), copyFilePath);
        }
        
        for (StyleFile styleFile : this.styleFiles) {
            String copyFilePath = createCopyFilePathInNewDir(
                    styleFile, commonDirPathOfFiles);
            FileUtils.copyFile(styleFile.getPath(), copyFilePath);
        }        

        // modifikace a kopírování zdrojových souborů, 
        for (HtmlFile srcFile : this.allHtmlFiles) {
            String modifiedCopyOfSrcFilePath = createCopyFilePathInNewDir(
                    srcFile, commonDirPathOfFiles); // (+ dstDir)

            HtmlFile modifiedCopyOfSrcFile = 
                    new HtmlFile(modifiedCopyOfSrcFilePath);

            if (modifyHtmlFiles) {
                logger.fine("modifyHtmlFiles");
                SrcFileModifier sfm = new SrcFileModifier(
                        srcFile, modifiedCopyOfSrcFile);
                sfm.modify();
            }
            else {
                logger.fine("copy");
                logger.fine(srcFile.getAbsolutePath() + "  -->  " + modifiedCopyOfSrcFile.getAbsolutePath());
                FileUtils.copyFile(srcFile.getAbsolutePath(), modifiedCopyOfSrcFile.getAbsolutePath());
            }
        }
    }

    
    /**
     * 
     * @param srcFiles  může obsahovat i prázdné hodnoty, null; jsou přeskočeny
     */
    private void addToHtmlFilesList(ArrayList<String> srcFiles) {
        logger.fine("");

        for (String srcFilePath : srcFiles) {
            if (StringUtils.isBlank(srcFilePath)) {
                continue;
            }
            if (FileUtils.hasFileExtension(srcFilePath, 
                    Constants.HTML_EXTENSIONS)) {
                
                // absolutizace odkazů v srcFiles
                String srcFileAbsPath = new File(srcFilePath).getAbsolutePath();

                logger.fine("srcFileAbsPath = " + srcFileAbsPath);
                
                HtmlFile srcFile = new HtmlFile(srcFileAbsPath);
                this.allHtmlFiles.add(srcFile);
                logger.finer("add:  " + srcFile);
            }          
        }                
    }
    
    /**
     * 
     * @throws IOException 
     */
    private void initHtmlFiles() throws IOException {
        logger.fine("");
        for (HtmlFile htmlFile : allHtmlFiles) {
            try {
                htmlFile.setConvertImgAndStylePathToAbs(true);   // !
                htmlFile.initExisting();
                this.images.addAll(htmlFile.getImages());
                this.styleFiles.addAll(htmlFile.getStyleFiles());                    
            } catch (IOException ex) {
                logger.warning(ex.toString());
                throw ex;                    
            }
        }            
    }       

    
    /**
     * 
     * @return 
     */
    private Set<String> getAllFiles() {
        Set<String> result = new TreeSet<String>();

        for (ItemImage img : images) {
            result.add(img.getPath());
        }
        for (StyleFile style : styleFiles) {
            result.add(style.getPath());
        }
        for (HtmlFile src : allHtmlFiles) {
            result.add(src.getAbsolutePath());
        }
        
        logger.finest(result.toString());

        return result;
    }

}   // HtmlFilesImporter.java

